package jack.handler;

/**
 * created by Jack
 * email:yucrun@163.com
 * date: 2019/5/19
 * describe:
 *
 * 1.1.创建Handler对象；
 * 1.2.创建Handler发送消息的方法；
 * 1.3.sendMessage方法需要有message形参，故需要创建Message类；
 * 1.4.创建Looper类；
 * 1.5.Handler中持有Looper引用；
 * 1.6.Handler的构造中初始化Looper（参考源码）；
 * 1.7.进入Looper中，继续查看注释2.1；
 * 1.8.给Looper进行赋值，同时拿到MessageQueue(mQueue);
 * 1.9.由于在sendMessage方法中需要使用到MessageQueue(mQueue)的方法，回到MessageQueue(mQueue)类，查看;
 * 1.10.sendMessage方法，调用MessageQueue(mQueue)的消息入列方法；
 * 1.11.回到Looper类中的loop()方法的for(;;)中；
 * 1.12.定义转发消息和处理消息的方法[后面会解释为什么转发消息会定义在handler类中]；
 * 1.13.在sendMessage方法中指定一下Message的target属性的值；
 * 1.14.回到Message类；
 * 1.15.在dispatchMessage方法中调用handleMessage[处理消息]方法;
 * 1.16.到目前为止，实现了在Handler发送消息，最终又回到Handler中处理；
 *      这样设计的好处：遵循最少知道原则，handler的整个实现比较复杂，使用会比较方便。
 * 1.17.回到MessageQueue类中，消息如何入列和出列；
 *
 */
public class Handler {

    private Looper mLooper;
    private MessageQueue mQueue;

    public Handler() {

        //拿到当前线程的Looper对象
        mLooper = Looper.myLooper();

//        Log.i("Handler ", "123" + "Handler");

        //拿到mLooper中的MessageQueue(mQueue)
        mQueue = mLooper.mQueue;
    }

    /**
     * 发送消息
     * @param msg
     */
    public void sendMessage(Message msg){

        //指定一下Message的target属性的值
        msg.target = this;

        //发送消息，需要借助mQueue，调用消息入列的方法
        mQueue.enqueueMessage(msg);
    }

    /**
     * 转发消息
     * @param msg
     */
    public void dispatchMessage(Message msg) {
        //处理消息
        handleMessage(msg);
    }

    /**
     * 处理消息
     * @param msg
     */
    public void handleMessage(Message msg) {

    }

}
